package stone.ast;

import java.util.List;

import ASTInterpreter.Environment;

// primary :  "(" expr ")" | NUMBER | IDENTIFIER | STRING

public class PrimaryExpr extends ASTList {

	public PrimaryExpr(List<ASTree> list) {
		super(list);
	}
	
	public static ASTree create(List<ASTree> c) {
		return c.size() == 1 ? c.get(0) : new PrimaryExpr(c);
	}

	public ASTree operand() {
		return child(0);
	}

	public Postfix postfix(int nest) {
		return (Postfix)child(numChildren() - nest - 1);  // 嵌套调用，第0层返回最后一个posfix，最后一层，返回第一个posfix
	}

	public boolean hasPostfix(int nest) {
		return numChildren() - nest > 1;
	}

	public Object eval(Environment env) {
		return evalSubExpr(env, 0);
	}

	public Object evalSubExpr(Environment env, int nest) {
		if (hasPostfix(nest)) {
			Object target = evalSubExpr(env, nest + 1);	 // target是一个Function对象 // 不仅仅是一个Function对象
			return postfix(nest).eval(env, target);  // 调用函数，获取函数调用的结果 // 不一定是函数调用，也可能是类似obj.x的操作
		}
		else {
			return operand().eval(env);
		}
	}
	
}
